package com.xmhmyh.generalframework.framework.redis;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Author: 于丁
 * @Description: redis 通用类
 * @DateTime: 2020/7/21 10:09 上午
 * @Params:
 * @Return
 */
public interface IredisService {

    /**
     * 设置缓存值
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    void set(String key, Object value);

    /**
     * 设置有过期时间的缓存
     *
     * @param key         缓存key
     * @param value       缓存值
     * @param expiredTime 默认单位秒
     */
    void set(String key, Object value, Long expiredTime);

    /**
     * 设置有过期时间的缓存
     *
     * @param key         缓存key
     * @param value       缓存值
     * @param expiredTime 默认单位秒
     * @param timeUnit    时间单位
     */
    void set(String key, Object value, Long expiredTime, TimeUnit timeUnit);

    /**
     * 获取缓存值
     *
     * @param key 缓存key
     * @return
     */
    Object get(String key);

    /**
     * 删除缓存
     *
     * @param key 缓存key
     */
    void remove(String key);

    /**
     * 递增
     *
     * @param key 缓存key
     * @return
     */
    Long incr(String key);

    /**
     * 递增
     *
     * @param key 缓存key
     * @return
     */
    Long hincr(String key, String mkey);

    /**
     * 获取hash
     *
     * @param key 缓存key
     * @return
     */
    Map<Object, Object> hget(String key);

    /**
     * @Author: 于丁
     * @Description: 获取hash值
     * @DateTime: 2020/8/19 9:31 上午
     * @Params: * @param: null
     * @Return {@link null}
     */
    Object hgetItem(String key, String mkey);
    /**
     * HashSet
     * @param key 键
     * @param map 对应多个键值
     * @return true 成功 false 失败
     */
    boolean hSet(String key, Map<String, Object> map);

    /**
     * HashSet 并设置时间
     * @param key 键
     * @param map 对应多个键值
     * @param time 时间(秒)
     * @return true成功 false失败
     */
    boolean hSet(String key, Map<String, Object> map, long time);

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     * @param key 键
     * @param item 项
     * @param value 值
     * @return true 成功 false失败
     */
    boolean hSet(String key, String item, Object value);

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     * @param key 键
     * @param item 项
     * @param value 值
     * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    boolean hSet(String key, String item, Object value, long time);

    /**
     * 删除hash表中的值
     * @param key 键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    void hDel(String key, Object... item);

    /**
     * 存入
     *
     * @param key
     * @param value
     * @return
     */
    Long lPush(String key, Object value);


    /**
     * 取出
     *
     * @param key
     * @param waittime
     * @return
     */
    Object rPop(String key, Long waittime);

    /**
     * 取出
     *
     * @param key
     * @return
     */
    Object rPop(String key);

    Object sPop(String key);

    /**
     * 根据key获取Set中的所有值
     *
     * @param key 键
     * @return
     */
    Set<Object> sGet(String key);

    /**
     * 根据value从一个set中查询,是否存在
     *
     * @param key   键
     * @param value 值
     * @return true 存在 false不存在
     */
    boolean sHasKey(String key, Object value);

    /**
     * 将数据放入set缓存
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    long sSet(String key, Object... values);

    /**
     * 将set数据放入缓存
     *
     * @param key    键
     * @param time   时间(秒)
     * @param values 值 可以是多个
     * @return 成功个数
     */
    long sSetAndTime(String key, long time, Object... values);

    /**
     * 获取set缓存的长度
     *
     * @param key 键
     * @return
     */
    long sGetSetSize(String key);

    /**
     * 移除值为value的
     *
     * @param key    键
     * @param values 值 可以是多个
     * @return 移除的个数
     */
    long setRemove(String key, Object... values);
}
